黑客盗币手法与攻击面全景
0. 损失结构速览
关于"盗币",最常见的误解是:黑客靠找到智能合约的漏洞偷钱。这在 2016–2021 年大体成立,但 2022 年之后已经不成立了。先看四组数字,它们决定了整份文档的重心。
| 口径(来源) | 关键数字 | 说明 |
|---|---|---|
| DeFiLlama 累计(至 2026 年中) | $16.69B,约 40% 与"某人拿到了私钥"相关 | 不是区块链或合约漏洞,而是密钥控制权失守 |
| Chainalysis 2024 年报 | 全年被盗 $2.2B,私钥泄露占 43.8% | 2024 下半年攻击目标从 DeFi 转向中心化服务 |
| CertiK 2025 H1 | 被盗 $2.47B,其中钱包沦陷 $1.7B / 34 起 | 仅 Q1 三起大案就贡献 $1.45B(含 Bybit) |
| TRM Labs 2026 H1 | 基础设施类攻击 = 金额 76%,事件数仅 15% | 典型的"少量斩首、高价值"分布 |
注:各机构对"基础设施/私钥/钱包沦陷"的归类并不一致,数字不可跨表相加,只用于判断结构。
两条结论,贯穿全文:
1. "偷私钥"是金额问题——单次损失最大、最难追回、最依赖社工与供应链。
2. "写错合约"是频率问题——事件数量多、单次金额小、但 DeFi 内部损失里协议逻辑漏洞仍占约 89%(Immunefi 2025)。
所以本文不按"漏洞类型"排序,而按钱被拿走的路径排序:先看攻击者怎么走进来(行为图),再看这条路径上由哪些组件构成(结构图),最后逐类拆手法(第三部分)。
0.1 分析口径
- 只讨论"资产被非授权转移",包括私钥窃取、签名欺骗、合约逻辑滥用、基础设施入侵。H 类 的诈骗(Rug Pull、杀猪盘等)单独标注,因为它们不需要技术入侵,但真实损失占比很高。
- 金额以官方公告 / 慢雾 Hacked 档案库 / Chainalysis / CertiK 为准,不同口径差异可达 20%,文中标注来源,不做精确到小数点的断言。
- 不提供可直接用于攻击的完整 EXP。涉及利用细节的部分只讲到"机制层"——足够理解与防御,不足以照抄。
本章术语
- 私钥泄露(Private Key Compromise)
- 攻击者获得对某个地址(EOA)的完全控制权。链上无任何异常交易特征,因为交易本身就是"合法签名"的。
- 基础设施攻击(Infrastructure Attack)
- TRM 的分类口径:不攻击合约代码,而攻击运行合约、托管密钥、生成交易的那套系统——服务器、CI/CD、前端、DNS、云账号。
- 事件数 vs 金额
- 同一类攻击的"发生频率"和"造成损失"经常背离。钓鱼每年几十万起但单笔小;私钥泄露一年几十起却能吃掉全年一半损失。
1. 威胁模型:谁在偷、偷什么
在讨论手法之前必须先固定威胁模型。同一个"盗币"动作,国家级 APT 和脚本小子的路径完全不同:前者用半年做社工,后者用现成的钓鱼站批量撞运气。防护措施也必须分开设计。
1.1 四类攻击者
| 攻击者 | 资源与耐心 | 典型目标 | 代表案例 |
|---|---|---|---|
| 国家级 APT | 数月到数年;有预算、有组织、可长期潜伏 | 交易所、托管商、跨链桥、大额多签 | Lazarus / TraderTraitor(Bybit $1.46B、Ronin $624M、DMM $305M) |
| 组织化犯罪团伙 | 数周;流水线作业,钓鱼套件 + 洗钱通道齐全 | 散户钱包、DeFi 用户、中小项目 | 各类 approve 钓鱼、Permit 钓鱼、地址投毒 |
| 脚本小子 | 分钟级;扫全网暴露面 | 未初始化合约、弱随机数、暴露的 RPC / 私钥 | 扫描 GitHub 上的 `.env`、`eth_call` 批量探测 |
| 内部人员 | 知情、有权限 | 热钱包、提币审核、部署密钥 | 交易所内鬼、项目方卷款(多归入 H 类) |
一个反直觉的事实:绝大多数"黑客很厉害"的叙事,实际发生的是社工 + 供应链。Bybit 案里没有任何 0day,攻击者做的是让 Safe 的一名开发者运行了一个"看起来是正常任务"的恶意程序。技术门槛远低于宣传。
1.2 被盗的到底是什么
链上没有"钱"这个东西,只有状态。所谓盗币,本质是把一条合法签名的交易写进链上状态,把某个地址的余额改小、把另一个地址的余额改大。因此攻击者真正要拿到的,是下面四样之一:
| 目标物 | 拿到之后能做什么 | 典型载体 |
|---|---|---|
| 私钥 / 助记词 | 无限次签名,直到地址被清空 | 纸、截图、云笔记、密码管理器、浏览器扩展、硬件钱包备份 |
| 一次有效签名 | 单次转走指定额度,或留下长期授权 | approve / permit / 多签交易 / 离线签名文件 |
| 合约控制权 | 改逻辑、铸币、抽干资金池 | proxy admin / owner / upgrade authority |
| 基础设施凭据 | 改前端、改提币逻辑、读取密钥管理系统 | AWS/GCP token、CI secret、SSH、域名/DNS、S3 |
1.3 信任边界:钱在谁手里
把资金链路画成一条线,可以看出"托管"与"自托管"的信任边界完全不同:
自托管: 你 ──私钥──► 链上合约 ──► 资产
↑ 唯一失效点:私钥/签名设备
托管: 你 ──账号密码/2FA──► 交易所 ──热钱包私钥──► 链上 ──► 资产
↑ 失效点:账号、客服、服务器、热钱包、提币风控
合约账户:你 ──签名者 k-of-n──► Safe/MPC 合约 ──► 资产
↑ 失效点:每个签名者的设备 + 前端(交易内容展示层)+ 合约本身
第三行是关键:多签把"单点私钥"拆成了多个点,但引入了一个新的单点——前端。签名者看到的内容由前端渲染,多签只保证"有这个数量的签名",不保证"签的内容是你以为的内容"。Bybit 案正是打在这里。
本章术语
- EOA(Externally Owned Account,外部账户)
- 由私钥直接控制的账户。签名即生效,没有"二次确认"的概念。
- 合约账户(Contract Account)
- 由代码控制,转账必须满足代码逻辑。多签钱包(Safe)、MPC 钱包、AA 钱包都属于此类。
- 信任边界(Trust Boundary)
- 数据或控制权在不同信任级别的主体之间跨越的位置。攻击者总是找边界上"验证最弱"的那一跳。
- APT(Advanced Persistent Threat,高级持续性威胁)
- 有国家或组织背景、长期潜伏、目标明确的攻击者。与"机会主义攻击"相对。
2. 攻击生命周期
把 40 多个具体手法压缩成一条流水线,会发现它们都落在七个阶段里。理解阶段的意义在于:防御只需要切断其中任意一环,而攻击必须七环全通。
| 阶段 | 攻击者要解决的问题 | 常见技战术(详见第三部分) | 可切断点 |
|---|---|---|---|
| 1 侦察 | 谁有钱、谁在用 Safe、谁的员工会点链接 | 链上分析、社媒画像、GitHub 依赖清单、招聘信息 | 减少公开暴露面 |
| 2 初始立足 | 进入一台机器或一个账号 | 钓鱼邮件、假面试、恶意 npm 包、暴露的 RPC/后台 | 终端防护、邮件网关、最小权限 |
| 3 凭据收集 | 把"一台机器"变成"一套权限" | infostealer、浏览器 cookie、AWS 会话 token、SSH key | 硬件密钥、短期凭据、分权 |
| 4 权限获取 | 拿到能动的钱的那把钥匙 | 私钥文件、云 KMS、CI secret、签名者设备 | HSM/MPC、多签阈值、时间锁 |
| 5 资产归集 | 找出所有能拿的 | 扫 approve、扫同助记词派生地址、扫侧链余额 | 定期撤销授权、地址隔离 |
| 6 转移 | 在受害者反应前搬走 | 拆单、批量、抢先(front-run)救援交易 | 监控告警、自动暂停、限额 |
| 7 洗钱变现 | 切断链上追踪 | 混币器、跨链、DEX、NFT 洗价、OTC | 交易所冻结、链上标记 |
第 4 阶段是分水岭。前三个阶段完成并不等于钱会丢——攻击者可能只拿到一台办公电脑。真正决定损失的是第 4 阶段:这台电脑上有没有签名能力、云账号里有没有 KMS 权限。绝大多数"被入侵但没损失"的案例,都是在这一步断掉的。
2.1 驻留时间为什么重要
国家级攻击者的平均驻留时间以月计。Bybit 案中,Safe 开发者被控后,攻击者等待了数周才动手——因为要等一个"目标正在发起多签交易"的时机,让篡改后的页面出现在正确的人面前。这类"守株待兔"式攻击有两个特征:
- 不会触发异常登录告警(用的是合法会话)。
- 不会在链上留下探测痕迹(从不上链)。
因此针对 APT 的检测重点不是"异常交易",而是发布链完整性:前端构建产物是否可复现、S3 写入是否有人审、CI 是否有签名校验。
3. 签名端攻击链
这是最主流、也最被低估的一条链。它不需要攻破任何服务器,只需要让用户在"看起来正常"的页面上签一次名。
3.1 为什么"签一次名"就够了
以太坊的授权模型有两个设计,被攻击者用到了极致:
- approve 是独立的、无限期的状态。你授权某个合约"可以花我的 USDC",这条授权写进 ERC-20 合约的
allowance[owner][spender],直到你主动改回 0。页面关了、钱包断了、电脑重启,授权还在。 - permit 是离线签名。EIP-2612 允许用一条签名消息完成授权,不上链、不花 gas、不弹"确认交易"。用户看到的只是一段"登录签名",实际签的是一张空白支票。Permit2 把这个能力扩展到了所有 ERC-20。
| 签名类型 | 用户看到的 | 实际授权的 | 危险点 |
|---|---|---|---|
approve(spender, amount) | "连接钱包 / 授权" | 某地址可转走 amount(常见为 2^256-1) | 无限额、无到期 |
permit(...) (EIP-2612) | "登录签名,不花 gas" | 离线授权,任何人可代提交上链 | 无交易弹窗,最易被骗 |
Permit2.permit(...) | "一次授权,处处可用" | 对 Permit2 合约的全局授权 | 一次签名覆盖所有代币 |
setApprovalForAll(op, true) | "授权收藏品" | 整个 NFT 集合的转移权 | 一次签走全部 NFT |
eth_sign / personal_sign | "验证钱包所有权" | 对任意 hash 的签名,可被拼成合法交易 | 盲签,内容不可读 |
EIP-7702 authorization | "升级钱包 / 领取空投" | 把 EOA 的代码委托给指定合约 | 委托后所有转入自动被扫走 |
3.2 EIP-7702:2025 年之后的新变量
Pectra 升级(2025-05)引入 EIP-7702,允许 EOA 设置一段代码(delegation),从而获得智能合约账户的能力。这带来一个全新的攻击面:
正常: 你的 EOA ──签名──► 转账交易
被诱骗:你的 EOA ──签名──► 7702 authorization ──► 委托给攻击者合约
之后:任何人往你地址打币 → 攻击者合约的 fallback 自动转走
关键差异在于持续性:approve 钓鱼偷的是"当前余额",7702 钓鱼偷的是"这个地址的未来"。2025 年下半年已出现专门扫描 7702 委托、自动清空入账的 sweeper 机器人(社区称 CrimeEnjoyor 类合约),资金一进即出,人工根本来不及。
识别要点:钱包弹窗里出现 Set EOA account code / Authorization / Delegation 字样,且你并没有主动做"账户升级",一律拒绝。这不是普通交易。
3.3 盲签与"所见非所签"
即使不涉及 approve,签名环节本身也可被攻击:
- 盲签(Blind Signing):硬件钱包屏幕小,只能显示地址和金额,复杂合约调用的
data字段无法解析。攻击者构造一笔"看起来是转账 0 ETH"的交易,实际data是transferFrom。 - 交易模拟欺骗:钱包用第三方 RPC 做
eth_call模拟,攻击者控制的 RPC 可以返回"一切正常"的模拟结果。 - 地址投毒(Address Poisoning):从相似首尾字符的地址给你打 0 USDT,让你的交易历史里多出一条"看起来对"的地址。下次你从历史记录复制,钱就进了攻击者口袋。
本章术语
- allowance(授权额度)
- ERC-20 合约里记录的"owner 允许 spender 动用的上限"。它是链上状态,与你的登录状态无关。
- Permit / Permit2
- EIP-2612 定义的离线授权签名;Uniswap 的 Permit2 把它泛化到所有 ERC-20,并引入"一次授权、多协议共享"。
- 盲签(Blind Signing)
- 签名设备无法展示待签内容的真实语义,用户只能凭"看起来像"来确认。
- 地址投毒(Address Poisoning)
- 用首尾字符相同的小额转账污染你的交易历史,诱导你复制错误地址。
- EIP-7702
- Pectra 升级引入的"给 EOA 设置代码"机制,让普通地址可以临时或长期具备合约逻辑。
4. 供应链攻击链:Bybit 复盘
2025-02-21,Bybit 的 ETH 冷钱包(Safe 多签)被转走约 40 万 ETH,价值 14.6 亿美元,是史上最大单笔。这起案件之所以必须单独讲,是因为它同时击穿了"冷钱包"和"多签"两个被视为终极防线的假设,而用的不是 0day。
4.1 事件时间线
| 时间(UTC) | 事件 |
|---|---|
| 2025-02 之前数周 | 攻击者通过社工诱骗 Safe{Wallet} 一名开发者运行恶意程序,控制其工作站 |
| 潜伏期 | 收集 AWS 会话 token,取得存放 Safe 前端静态资源的 S3 存储桶写权限 |
| 2025-02-21 13:30 | Bybit 从 Safe 多签冷钱包向热钱包发起例行转账(30,000 ETH) |
| 2025-02-21 14:13 | 签名者在前端看到的是"正常转账",实际签名的是被篡改的 multisend 调用 |
| 数分钟内 | Safe 合约的 MasterCopy 被 delegatecall 替换为恶意实现,资金分 40 余笔转出至 39 个地址 |
| 2026-08 | Bybit 在美国对朝鲜、RGB 及 Lazarus 提起民事诉讼,法院下达初步禁令冻结部分资产;累计追回约 $48.4M |
4.2 技术拆解:一次 delegatecall 改存储
Safe 钱包是典型的代理合约模式:用户交互的 Safe 实例只存状态(owners、threshold、nonce),逻辑在 MasterCopy 里,实例的 storage slot 0 存着 MasterCopy 地址。正常升级流程是:多签批准 → 调用 changeMasterCopy → 写入新地址。
攻击者的做法是把这次升级"藏进"一次普通转账里:
// 前端展示的:multisend 批量转账
to: MultiSendCallOnly
data: multiSend([ transfer(to=热钱包, value=30000 ETH) ])
// 实际签名的:multisend 里夹了一条对 Safe 自身的调用
to: MultiSendCallOnly
data: multiSend([
transfer(to=热钱包, value=30000 ETH),
call(to=Safe自身, data=changeMasterCopy(恶意实现)) ← 隐藏项
])
为什么签名者没看出来:
- Safe 前端不解析
MultiSend内部调用的完整语义,只展示"批量转账"; - 硬件钱包对
delegatecall类操作只显示合约地址,不显示存储变更; - 被篡改的 JS 只对特定来源 IP / 特定钱包地址生效,其他访问者看到的页面完全正常——事后很难复现。
替换 MasterCopy 之后,恶意实现里 transfer 的语义被改成"把全部余额转给攻击者",于是后续任何一次提币都是一次清空。这就是"冷钱包"失效的真正含义:冷的是私钥,不冷的是签名时看的那块屏幕。
4.3 三个可复用的结论
1. 多签解决的是"谁能签",不解决"签什么"。阈值为 3/5 也挡不住 5 个人都看到假页面。
2. 前端是签名协议的一部分,必须当作生产系统来管。S3 写权限、CI 发布、CDN 缓存,任何一处被改,等同于私钥被改。
3. 供应链攻击的成本极低。不需要找合约漏洞,只需要一个能运行 exe 的员工。
| 同类案例 | 时间 | 金额 | 供应链环节 |
|---|---|---|---|
| Bybit | 2025-02 | $1.46B | Safe 前端 JS(S3) |
| BigONE | 2025-07 | $27M | 生产网络被入侵,改账户与风控服务器逻辑(私钥未泄露) |
| Paradex | 2025 | — | 第三方交易机器人内部系统被入侵,57 个用户子密钥泄露 |
| BitoPro | 2025-05 | $11.5M | 恶意程序 + 热钱包批量转出 |
本章术语
- 代理合约(Proxy Contract)
- 用户调用的地址不变,逻辑实现在另一个合约里,通过
delegatecall执行。好处是可升级,坏处是"升级权限"等于"资金权限"。 - delegatecall
- 在当前合约的存储上下文里执行另一个合约的代码。被调合约能改写调用者的 storage——这正是改 MasterCopy 的原理。
- MultiSend
- Safe 提供的批量调用合约,把多笔操作打包成一笔。它天然适合藏匿附加调用。
- 供应链攻击(Supply Chain Attack)
- 不直接攻击目标,而攻击目标信任的上游——开发者、依赖包、CI、CDN、S3。
5. 合约层攻击链
这是"传统意义上"的黑客盗币:不改私钥、不骗签名,直接让合约按错误的价格或错误的余额把资金放出去。它单笔金额通常小于私钥案,但发生频率高得多。
5.1 闪电贷为什么是放大器
闪电贷(Flash Loan)允许在一笔交易内借出任意规模的资金,只要在同一笔交易结束前归还本金加手续费。它本身完全合法,但把攻击者的"启动资金"从数千万降到零:
tx {
1. 从 Aave/Balancer 借出 100,000,000 USDC // 无需抵押
2. 用其中 50,000,000 在目标协议的池子里砸盘 // 价格被压低
3. 目标协议按"现价"计算你的抵押物价值 → 高估
4. 借出远超实际价值的资产
5. 撤销砸盘、归还闪电贷
6. 净赚差额
} // 原子性:任一步失败,整笔回滚,攻击者零成本试错
注意第 6 步的"零成本试错":因为交易是原子的,攻击者可以在链下模拟上千次,只在成功的那一次上链。这让"漏洞是否可利用"的判断变得极其廉价。
5.2 四类合约层失效
| 失效类型 | 本质 | 代表案例 |
|---|---|---|
| 价格来源不可信 | 用池子现货余额当预言机,可被单笔交易操纵 | Mango Markets($114M)、bZx(2020) |
| 记账/精度错误 | 舍入方向、溢出边界、单位换算写错,导致可凭空放大余额 | Cetus(2025-05,$223M,溢出使 1 个代币被估成天价)、Abracadabra(2025-10,$1.8M,舍入) |
| 重入与状态不一致 | 先转账后改状态,回调里再进来一次 | The DAO(2016)、Curve/Vyper 编译器重入锁失效(2023,$70M) |
| 权限与初始化缺失 | 构造函数可被再次调用、owner 未设、代理未初始化 | Parity 多签(2017,$150M+,initWallet 未加锁) |
Cetus 案值得单独记住:它不是"被操纵",而是算术溢出。攻击者在 checked_shlw 的边界上构造输入,让"1 个代币"在内部计算里变成 2192 量级,再用它去换走池子里真实资产。Sui 验证者随后冻结了约 $162M,但这类"代码写错一个字"的损失,任何审计都可能漏掉。
5.3 为什么"审计过"不等于安全
Halborn 的统计显示:被黑的协议里只有约 20% 做过审计,而审计过的协议贡献了约 10.8% 的损失金额。这两个数字合起来说明——审计降低的是"低级错误"概率,不降低"经济模型被利用"概率。预言机操纵、清算逻辑、激励错配,都是"代码没错、设计有洞"。
本章术语
- 闪电贷(Flash Loan)
- 无需抵押、必须在同一笔交易内归还的贷款。原子性使它成为零成本攻击杠杆。
- 预言机操纵(Oracle Manipulation)
- 通过大额交易改变协议读取的价格源(尤其是把 DEX 现货池当价格源的设计)。
- 重入(Reentrancy)
- 合约在完成自身状态更新前调用外部合约,外部合约回调再次进入,重复执行取款逻辑。
- 原子性(Atomicity)
- 一笔交易内的所有操作要么全部生效,要么全部回滚。攻击者因此可以无成本地反复试错。
6. 跨链桥攻击链
跨链桥是"把一条链上的信任搬到另一条链",它的安全性等于验证机制与签名者集合两者中较弱的那一个。历史上桥的损失总额长期占 DeFi 被盗金额的最大份额,原因就在这里:桥同时持有巨额流动性,且必须信任链下组件。
| 失效模式 | 机制 | 案例 |
|---|---|---|
| 伪造消息通过验证 | 验证合约未正确校验 Merkle 根 / 签名 / 链 ID,攻击者直接构造"已存款"证明 | Wormhole(2022,$326M,签名验证被绕过)、Nomad(2022,$190M,根被设为 0 后任何人可伪造) |
| 验证者私钥沦陷 | 多签阈值过低或签名者被社工,直接签出非法跨链消息 | Ronin(2022,$624M,5/9 中拿到 5 把,源于假 offer letter)、Harmony Horizon(2022,$100M,2/5) |
| 流动性池被掏空 | 桥的 AMM 层存在与普通 DEX 相同的价格/精度问题 | 各类桥内 Swap 模块 |
| 中继器/Relayer 被控 | 链下中继进程被入侵,提交伪造事件 | 多起小型桥事件 |
Ronin 案的教训最直接:攻击者冒充招聘方,给 Axie Infinity 的工程师发了一份"薪资很高的 offer",附件是恶意 PDF。拿到 4 把验证者私钥后,再加上早已控制的 1 把,凑够 5/9 阈值。整个攻击里没有任何密码学被攻破——阈值签名只在你相信"签名者不会点附件"时才成立。
7. 交易生命周期与可篡改点
把任何一笔转账拆成状态机,可以看到攻击者能在哪些环节动手。这张图是全文的"索引":第三部分的每个手法,都能对应到这里的某个状态转移。
| 状态 | 此时发生什么 | 可被攻击的方式 |
|---|---|---|
| 构造 Constructed | DApp 生成 to / data / value / chainId / nonce | 前端 JS 被篡改、恶意 DApp、RPC 返回假数据 |
| 展示 Rendered | 钱包解析并显示"你在做什么" | 解析器缺陷导致展示与实际不符(盲签) |
| 签名 Signed | 私钥对交易哈希签名 | 私钥泄露、签名设备被控、用户被骗签 permit |
| 广播 Broadcast | 发到 RPC 节点进入 mempool | 恶意 RPC 扣留/替换交易、抢跑 |
| 待打包 Pending | 在 mempool 里排队 | 三明治攻击、替换交易(同 nonce 提高 gas) |
| 执行 Executed | EVM 按字节码改变状态 | 重入、预言机、权限逻辑被滥用 |
| 确认 Finalized | 达到最终性,不可回滚 | 仅剩重组风险(概率极低,PoW 链略高) |
最重要的认知:"签名"这个动作,签的是字节,不是意图。链上只验证"这个字节串的签名对不对",永远不验证"你是不是真的想这么干"。所有签名类攻击都建立在这个缝隙上。
8. 赃款外逃与洗钱
盗币的最后一环不是技术,而是"如何让钱变得可用"。这一步决定了追回率——Bybit 案两年后追回约 $48.4M,不到 3.4%。
8.1 四层结构
- 分层(Layering):把大额拆成成百上千笔,在数千个新地址间跳转。Bybit 案中资金被拆成 40 余笔 1 万 ETH 级别,再分散到 39 个地址。
- 混币(Mixing):Tornado Cash、Cryptomixer 等,切断输入与输出的链上关联。2025 年后主要混币器被执法打击,转向跨链 + DEX + 场外。
- 跨链(Bridging):Thorchain、跨链 DEX,把资产换到比特币等追踪难度更高的网络,再进 Wasabi 等隐私钱包。
- 变现(Cash-out):OTC 柜台、小型交易所、场外担保、NFT 自买自卖洗价。
8.2 为什么"链上透明"没能阻止洗钱
链上数据公开,但身份不公开。分析公司能做的是"聚类"——把行为相似的地址归为一簇——而不是"确认身份"。攻击者的应对方式很朴素:
- 每次转移都换新地址,且不与已知实体交互;
- 使用不合规交易所(无 KYC 或 KYC 可伪造);
- 用跨链把资产搬到分析覆盖较弱的链;
- 用 NFT / 游戏道具做"洗价交易",把赃款伪装成交易收入。
本章术语
- 分层(Layering)
- 洗钱三阶段中的第二段:通过大量拆分与转移,切断资金与来源的直接关联。
- 混币器(Mixer / Tumbler)
- 把多人的资金混在一个池子里再取出,破坏输入输出的一一对应。
- 聚类(Clustering)
- 链上分析的基本方法:通过共同花费、充值地址、交互模式,把多个地址推断为同一主体。
- OTC(Over-the-Counter,场外交易)
- 不经过公开订单簿的私下成交,是赃款变现的主要出口之一。
9. 分层攻击面
行为图回答"怎么被偷",结构图回答"哪一层被偷"。把资金链路按物理/逻辑位置分层,可以看出每层的信任主体、典型漏洞和不可替代的控制点。
| 层 | 组成 | 信任主体 | 典型失效 |
|---|---|---|---|
| L1 用户端 | 浏览器、钱包扩展/App、硬件钱包、剪贴板、相册、云备份 | 用户自己 | 助记词泄露、infostealer、剪贴板劫持、假 App |
| L2 接入端 | DApp 前端、CDN/S3、RPC 节点、WalletConnect 中继 | 项目方 + 服务商 | 前端 JS 篡改、恶意 RPC、假域名、广告位钓鱼 |
| L3 服务端 | 交易所/托管后端、KMS/HSM、CI/CD、运维跳板 | 机构 | 服务器入侵、CI secret 泄露、内鬼、热钱包私钥 |
| L4 链上 | 合约、代理、预言机、验证者/排序器 | 代码 + 共识 | 重入、权限缺失、预言机操纵、MEV |
| L5 跨链 | 桥合约、验证者集合、中继器 | 桥的验证机制 | 伪造消息、阈值签名沦陷 |
| L6 出口 | CEX、OTC、混币器、法币通道 | 监管与合规 | (攻击者的)变现通道被冻结 |
层级不是并列的,而是串联的。攻击者只需要攻破任意一层就能拿到资产;防守方必须每一层都成立。这是安全经济学里最不对称的地方,也是为什么"多层防御"不是口号而是必需。
9.1 最弱的一层通常不在技术栈里
统计上,L1 与 L3 贡献了绝大部分损失金额,而这两层的共同点是——它们都由"人"操作。L4 的合约漏洞虽然事件多,但单笔金额往往被 TVL 和闪电贷上限约束。
10. 签名栈与信任模型
所有"非授权转移"最终都要经过一次签名(或一次合约调用授权)。签名栈的每一层都在替下一层"翻译"信息,而翻译过程就是攻击面。
| 方案 | 私钥在哪 | 谁能单独转走 | 真实失效点 |
|---|---|---|---|
| EOA 热钱包 | 浏览器扩展 / 手机 App 本地 | 拿到扩展数据或助记词的人 | 扩展漏洞、恶意插件、设备被控 |
| 硬件钱包 | 安全芯片内,永不出设备 | 能在设备上按下确认的人 | 盲签、假固件、供应链替换、胁迫 |
| Safe 多签 | n 个签名者各自的设备 | ≥ threshold 个签名者 | 前端篡改、签名者设备集体沦陷、合约升级权限 |
| MPC 钱包 | 分片在多方,签名时协同计算 | ≥ 阈值的分片持有方 | 协调服务器被控、签名策略配置错误、单点 UI |
| 交易所托管 | 机构 KMS/HSM + 热钱包 | 机构(你只有债权) | 账号被盗、客服社工、平台被黑、平台跑路 |
10.1 每一层都在"信任"下一层
用户 → 相信 → 钱包 UI 显示的语义
钱包 UI → 相信 → DApp 传来的 calldata
钱包内核 → 相信 → 硬件钱包屏幕(如果用了)
硬件钱包 → 相信 → 自己解析的 4byte selector + 参数
合约 → 相信 → 签名者集合与阈值
签名者 → 相信 → 自己那台电脑没被控
Bybit 案断在倒数第二行:签名者相信自己电脑上的浏览器。Ronin 案断在最后一行:签名者相信自己没点开那个 PDF。
设计原则:不要试图让某一层"绝对安全",而是让相邻两层使用不同的信任源。例如:硬件钱包屏幕显示的收款地址,应该与你在另一台设备上独立核对的地址一致,而不是与 DApp 页面一致。
11. 合约代理与权限矩阵
链上资金的实际控制权,体现在"谁能让合约执行任意代码"。多数人只关注 owner,忽略了 proxy admin、guardian、upgrade authority 这三个更危险的权限。
| 角色 | 能做什么 | 若被攻破的后果 | 应有的约束 |
|---|---|---|---|
owner | 调用业务管理函数(改费率、加白名单) | 视函数权限而定,通常不能直接转账 | 多签 + 时间锁 |
proxy admin | 升级实现合约 | 等于拿走全部资金 | 独立多签 + 24h 以上时间锁 + 监控 |
guardian | 紧急暂停 | 可冻结用户资金(DoS) | 多签,且与 admin 分离 |
upgrade authority | Solana 等链上升级程序 | 等于拿走全部资金 | 多签 + 冷存储 |
11.1 Parity 案:一次未加锁的初始化
2017 年,Parity 多签钱包的库合约 initWallet 没有限制"只能调用一次",也没有校验调用者。攻击者直接调用它,把库合约的 owner 改成自己,然后 selfdestruct。所有依赖这个库的钱包实例瞬间失效,约 51 万 ETH 被永久冻结(当时约 $150M+)。
这个案例的教学价值在于:它既不是私钥被盗,也不是重入,而是"初始化函数忘了加锁"。在权限矩阵里,它属于"任何人都能成为 owner"这一类。
12. 交易与授权数据模型
如果只能记住一张图,记这张。所有签名类攻击,改的都是下面这几个字段之一。
| 字段 | 含义 | 被篡改后的效果 |
|---|---|---|
to | 目标地址 | 钱去了攻击者地址;或调用了恶意合约 |
data | 调用的函数与参数 | "转账"变成 transferFrom;"领取"变成 approve |
value | 附带的原生币数量 | 金额被放大,或归零以伪装成"免费操作" |
chainId | 链标识 | 重放攻击:在 A 链签的交易拿到 B 链执行 |
nonce | 账户交易序号 | 抢跑、替换、使原交易失效 |
gas / maxFee | 手续费参数 | 提高 gas 抢先执行救援交易 |
deadline | 签名有效期 | 缺失则签名永久有效(permit 常见问题) |
spender / operator | 被授权方 | 授权给了攻击者合约 |
amount | 授权额度 | type(uint256).max = 无限授权 |
实操含义:硬件钱包"清签"(Clear Signing)的价值,就是把这几个字段以人可读的方式呈现出来。任何无法解析 data 的签名请求,都应该被视为高风险。
13. 手法全谱系
把前面所有内容收成一张分类图。A–G 是技术性入侵,H 是社会工程/经济模型滥用,单独标注。
| 类别 | 核心问题 | 典型单笔量级 | 可检测性 |
|---|---|---|---|
| A 私钥与凭据 | 钥匙本身被复制 | $10M – $1B | 低(交易看起来完全合法) |
| B 签名与授权 | 你亲手签了它 | $1K – $10M | 中(可撤销授权) |
| C 供应链 | 你信任的工具被改了 | $10M – $1.5B | 低(事后难复现) |
| D 合约与协议 | 代码逻辑被滥用 | $1M – $600M | 高(链上可模拟) |
| E 基础设施与内鬼 | 系统或人失守 | $10M – $500M | 中(日志可查) |
| F 组织化作案 | 针对人的长期渗透 | 不定 | 低 |
| G 密码学与共识 | 底层假设被打破 | 极小(近年罕见) | 高 |
| H 诈骗(非入侵) | 你自愿转的 | $1K – $100M | — |
14. A 类 · 私钥与凭据
私钥泄露是单笔损失最大的一类,也是最"安静"的一类:链上看到的是合法签名,没有任何异常调用。它几乎全部发生在人这一侧。
14.1 泄露途径全表
| 途径 | 机制 | 为什么有效 |
|---|---|---|
| 助记词钓鱼页 | 伪装成"钱包验证 / 空投领取 / 账号恢复",要求输入 12/24 个词 | 任何要求输入助记词的页面都是骗局,但恐慌时容易上当 |
| 假钱包 App / 扩展 | 应用商店或搜索结果里的仿冒品,安装时就把助记词回传 | 图标、名称、评分都可伪造;官方商店审核不覆盖更新内容 |
| 信息窃取木马(infostealer) | RedLine、Lumma、Vidar 等,扫浏览器扩展目录、钱包文件、剪贴板、截图 | 不需要 0day,靠恶意广告、破解软件、假安装包传播 |
| 云备份 / 截图 / 相册 | 助记词拍照存相册、记在 iCloud 备忘录、微信收藏 | 账号一旦失守,备份就是明文 |
| 剪贴板劫持 | 木马监控剪贴板,把复制的地址替换成攻击者地址 | 用户只看首尾几位 |
| SIM Swap / 邮箱接管 | 补办手机卡或接管邮箱,重置交易所密码与 2FA | 短信 2FA 是单点;邮箱是多数账号的恢复入口 |
| 假客服远程控制 | 冒充交易所/钱包客服,诱导安装 AnyDesk/TeamViewer | 一旦远控,等于把设备交给对方 |
| 日志与遥测上报 | 钱包 SDK 把敏感数据写进日志并上传第三方 | Slope 案:助记词进了 Sentry 日志 |
| 物理获取 / 胁迫 | 入室、抢夺、绑架(wrench attack) | 再强的密码学也挡不住暴力 |
14.2 三个值得记住的案例
日本交易所 DMM Bitcoin 的私钥管理委托给第三方钱包服务商 Ginco。攻击者通过社工入侵 Ginco 员工,取得其钱包管理系统的操作权限,最终签出非法转账。这是典型的"托管链上的第二跳":你以为资产在 A,其实 A 把钥匙给了 B,而 B 的员工点了链接。
密码管理器 LastPass 的云备份被攻破,其中包含用户加密的 vault。攻击者用从 vault 里找到的助记词,在 2023 年陆续清空多个加密钱包。教训:密码管理器适合存密码,不适合存助记词——它把"离线保管"变成了"在线保管"。
Solana 钱包 Slope 把用户的助记词以明文写进了应用日志,日志被发送到第三方监控平台 Sentry。攻击者从日志里批量提取助记词,一次性清空数千个地址。这不是"被攻破",而是把秘密写到了不该写的地方。
14.3 防御要点
- 助记词只存在于离线介质:纸/金属板,或硬件钱包内,永不进入任何联网设备(包括拍照、备忘录、密码管理器)。
- 2FA 用硬件密钥或 TOTP,不用短信;邮箱单独用一个不与交易所关联的地址。
- 大额与日常分离:日常热钱包只放"丢了不心疼"的量。
- 任何人要助记词、要远程控制、要"帮你验证",一律视为攻击。官方客服永远不会索要这些。
15. B 类 · 签名与授权
这一类不需要偷钥匙,只需要你在某个页面点一次"确认"。它的单笔金额通常小于私钥案,但覆盖面极广,是散户损失的第一大来源。
15.1 授权(approve)滥用
ERC-20 的 approve(spender, amount) 会在链上留下一条长期有效的授权。攻击者只要让你对他的合约做一次无限授权,之后可以在任何时间、不需要你任何操作,把余额转走。
// 你签的
approve(0xAttack..., 115792089237316195423570985008687907853269984665640564039457584007913129639935)
// 之后攻击者随时可以
transferFrom(你的地址, 攻击者地址, 你的全部余额) // 不需要你再签名
变体:
- setApprovalForAll:一次授权整个 NFT 集合,比单 token 授权危险得多。
- Permit(EIP-2612):离线签名授权,不弹交易确认,用户以为只是"登录"。
- Permit2:一次签名覆盖所有 ERC-20,且可被多个协议共享。
- ERC-721
permit:NFT 的离线授权,同样无 gas、无弹窗。
识别方法:钱包弹窗里出现 Approve、Set Approval For All、Permit、Increase Allowance,且对象是你不认识的地址、额度是无限——直接拒绝。真正需要授权的 DApp,通常只需要"用多少批多少"。
15.2 EIP-7702 委托攻击
2025 年 5 月 Pectra 上线后,EOA 可以通过一条 authorization 把自身代码委托给某个合约。攻击者把这条签名包装成"钱包升级 / 领取空投 / 修复漏洞",一旦签下:
- 你的地址从此具有攻击者合约的逻辑;
- 任何转入该地址的资产,会被 fallback 自动转走(sweeper);
- 即使你后来发现,也需要再签一条委托把它清掉——而余额可能已经是 0。
与 approve 的关键区别是持续性 + 自动化:approve 偷的是存量,7702 偷的是流量。2025 年下半年已出现专门盯这类地址的机器人,资金到账后数秒内被扫走。
15.3 盲签与展示欺骗
| 手法 | 用户看到 | 实际发生 |
|---|---|---|
eth_sign 盲签 | "验证钱包所有权" | 对任意 32 字节哈希签名,可被拼成合法交易 |
| 4byte selector 伪装 | 一个常见的 transfer 调用 | selector 被构造为另一个函数,参数被重新解释 |
| 交易模拟欺骗 | 模拟结果显示"无资产变化" | 用的是攻击者控制的 RPC,返回伪造结果 |
| 多签 UI 隐藏调用 | "批量转账 1 笔" | MultiSend 里夹带第 2 笔(Bybit) |
| 地址投毒 | 历史记录里"看起来对"的地址 | 首尾相同、中间不同的攻击者地址 |
15.4 钓鱼入口:页面是从哪来的
- 搜索广告:买下 "Uniswap"、"MetaMask" 等关键词的广告位,落地页是高仿站。
- X / Discord 账号被劫:项目方官号发"空投领取",可信度极高。
- 域名劫持 / 过期抢注:老牌项目的域名到期被抢注,或 DNS 记录被改。
- WalletConnect 恶意 dApp:扫一个二维码就连上了,页面可以任意构造签名请求。
- 假空投 / 假 NFT 空投:链上直接给你打一个"看起来值钱"的 NFT,诱导你去站点"领取"。这种叫 dusting / airdrop phishing。
2023–2025 年,"钓鱼即服务"(Phishing-as-a-Service)成熟:一套 drainer 套件按抽成收费(常见 20%–30%),包含高仿页面模板、钱包连接、自动扫描高价值授权、自动拆单转出、以及洗钱通道对接。这意味着发起一次钓鱼的技术门槛已经接近零,剩下只需要流量。
15.5 防御要点
- 定期撤销授权:revoke.cash / Etherscan Token Approval 检查器,把不用的授权置 0。
- 用"最小额度"授权,不要点"Max"。
- 拒绝一切 7702 委托,除非你明确知道自己在升级什么。
- 地址簿 + 全字符核对:不要从交易历史复制地址。
- 签名前看内容:硬件钱包上显示不出来的,就不要签。
16. C 类 · 供应链
供应链攻击的定义是:不攻击你,攻击你信任的上游。它的性价比极高——改一个 npm 包,可以同时命中几千个项目。
16.1 攻击面清单
| 环节 | 手法 | 案例 / 说明 |
|---|---|---|
| 前端静态资源 | 改 S3/CDN 上的 JS,针对特定用户注入恶意逻辑 | Bybit(Safe 前端)、Ledger Connect Kit(2023-12,约 $600K) |
| npm / PyPI 依赖 | 抢注相似包名、接管维护者账号、投毒 postinstall 脚本 | event-stream、ua-parser-js、colors 等历史事件 |
| 浏览器扩展 | 仿冒 Rabby/MetaMask 上架;或收购真扩展后更新恶意版本 | 商店审核不覆盖"更新后行为" |
| CI/CD | 窃取 runner token、改构建脚本、注入发布产物 | 构建产物无签名校验时几乎无法发现 |
| 云账号 | AWS 会话 token、S3 写权限、IAM 过度授权 | Bybit 案的关键一跳 |
| 第三方 SDK / 客服 | 客服机器人、数据分析 SDK 被入侵 | 可读取页面上的地址与签名请求 |
| 域名 / DNS / BGP | 改 NS 记录、劫持注册商账号、BGP 前缀劫持 | 用户访问的是真域名,内容是假的 |
| 硬件钱包 | 物流替换、假固件、供应链植入 | 应从官方渠道购买并校验包装 |
| 自动更新机制 | 更新服务器被控,推送恶意版本 | 等同于给所有用户装后门 |
16.2 Ledger Connect Kit:一次 npm 投毒
2023 年 12 月,攻击者通过钓鱼获取了一名前 Ledger 员工的 npm 发布权限,在 @ledgerhq/connect-kit 中植入恶意代码。任何集成了该库的 DApp(包括 Sushi、Revoke.cash 等)都会在用户连接钱包时弹出伪造的"紧急升级"提示,诱导签名。恶意版本存活约 5 小时,损失约 $600K。
这个案例说明:你的 DApp 安全性 = 你所有依赖中最弱的那一个,而依赖链通常有几百层。
可落地的三条:
1. 前端构建产物做 SRI(Subresource Integrity) 与发布签名。
2. 锁版本 + 私有镜像 + 依赖审计,禁止 postinstall 脚本任意执行。
3. 云账号按最小权限拆分,S3 写权限与生产发布权限分离,并开启写入审计告警。
17. D 类 · 合约与协议
这一类是"代码问题",也是最容易被公开复盘、最容易被自动化工具扫描的一类。它的攻击窗口通常只有几分钟,但可以在一笔交易内完成。
17.1 漏洞类型与判定
| 类型 | 触发条件 | 典型损失 |
|---|---|---|
| 重入 | 外部调用前未更新状态;回调可再次进入 | The DAO $60M、各类借贷池 |
| 精度 / 舍入 / 溢出 | 除法方向、单位换算、位移边界 | Cetus $223M、Abracadabra $1.8M |
| 预言机操纵 | 价格来自可被单笔交易影响的池子 | Mango $114M、bZx |
| 权限缺失 / 未初始化 | 初始化函数可重入、owner 未设、缺少 onlyOwner | Parity $150M+ |
| 代理升级 | admin 权限过宽或无私钥隔离 | 多起"升级即清空" |
| 签名重放 | 签名未绑定 chainId / nonce / 合约地址 | 跨链重放、批量重放 |
| 跨链验证 | Merkle 根、签名者、链 ID 校验不全 | Wormhole $326M、Nomad $190M |
| 治理攻击 | 闪电贷借票、提案门槛过低 | Beanstalk $182M |
| MEV / 三明治 | 不是"盗",但用户在交易中被抽走价值 | 长期、分散 |
17.2 为什么形式化验证也救不了经济模型
审计能证明"代码符合规格",但不能证明"规格是对的"。Mango Markets 案中,攻击者用两个自己控制的账户在永续合约里对倒,把 MNGO 价格推高,再以虚高抵押品借走 $114M。合约每一步都严格执行,错的是"用自家代币现货价当抵押品价格"这个设计。
判据:看到一个协议,先问三个问题——
① 价格从哪来?能不能被一笔交易改变?
② 谁能升级合约?升级有没有时间锁?
③ 有没有"用自家代币计价"的环节?
18. E 类 · 基础设施与内鬼
这一层是"机构级"攻击面。它的特点是:一旦破,损失规模由热钱包余额决定,而不是由你能多快反应决定。
18.1 失效点
| 失效点 | 机制 | 为什么难防 |
|---|---|---|
| 热钱包私钥 | 联网服务器上存私钥,或私钥在内存里可被 dump | 为了自动提币,必须联网 |
| 提币逻辑被改 | 不偷私钥,改"账户余额与风控"服务,让系统自己转钱 | BigONE 案:私钥从未泄露 |
| API Key / Secret | 泄露在 GitHub、日志、前端代码、客服截图里 | 很多 key 权限过大且无 IP 白名单 |
| 服务器入侵 | 暴露的运维端口、未打补丁的中间件、弱口令 | CoinDCX 案:官方称"复杂的服务器入侵" |
| 内部人员 | 有权限的人主动作恶或被收买 | 日志可伪造,权限本就合法 |
| 云账号 / IAM | root 账号或过度授权角色被接管 | 一个 token 就能改前端、读 KMS |
| DNS / 域名 | 注册商账号被控、NS 被改 | 用户地址栏看不出异常 |
| 备份 / 日志 | 备份里含私钥、日志里含助记词 | Slope 案即此类 |
18.2 案例对照
| 事件 | 时间 | 金额 | 根因 |
|---|---|---|---|
| Mt.Gox | 2014 | 约 85 万 BTC | 长期挪用 + 热钱包管理失控 |
| Coincheck | 2018-01 | $534M | NEM 热钱包私钥存于联网服务器,且未用多签 |
| Bitfinex | 2016-08 | $72M | 多签架构配置缺陷,签名接口被滥用 |
| CoinDCX | 2025-07 | $44M | 服务器入侵,仅公司自有资金受影响 |
| BigONE | 2025-07 | $27M | 生产网被入侵,改账户与风控逻辑,私钥未泄露 |
BigONE 案最值得警惕:传统风控假设"私钥没泄露 = 钱不会丢"。但当提币审核、余额记账、风控规则都由同一套后端服务决定时,改这套服务等同于改私钥。防御必须把"签名"与"记账"做成两个独立系统,且签名前有独立的额度校验。
18.3 内鬼为什么难检测
内鬼的所有操作在日志里都是"合法"的:有权限、在上班时间、用公司设备。可用的检测手段只有三类:
- 职责分离:任何单人都不能同时具备"发起 + 审批 + 部署"三种权限。
- 不可抵赖日志:写一次审计日志到独立系统(WORM 存储),管理员也不能删。
- 异常行为基线:非工作时间的提币、超历史峰值的额度、新设备首次操作。
19. F 类 · 组织化作案
这一类不针对系统,针对人。它的投入产出比最高:一次成功的社工,可以抵得上一年的漏洞挖掘。
19.1 典型剧本
| 剧本 | 流程 | 目标人群 |
|---|---|---|
| 假招聘 / 假 offer | LinkedIn 接触 → 高薪岗位 → 技术测试压缩包 / PDF → 木马 | 工程师、签名者、DevOps |
| 假 Zoom / 会议软件 | "面试要用我们的客户端" → 安装包带后门 | 远程岗位候选人 |
| 恶意文档 / LNK / 宏 | PDF 漏洞、快捷方式执行 PowerShell、宏下载载荷 | 财务、行政、HR |
| Deepfake 音视频 | 伪造高管指令,要求"紧急转账/提供验证码" | 财务、运维 |
| 水坑攻击 | 入侵目标常看的行业站点,挂载浏览器 exploit | 整个行业 |
| 长期潜伏 | 拿到一个低权限账号后慢慢横向,等关键时机 | 大型机构 |
| 假审计 / 假安全公司 | 以"免费审计"名义索取代码与部署权限 | 早期项目 |
| 绑架胁迫(wrench attack) | 物理威胁,逼本人转账 | 高净值个人 |
19.2 Lazarus 的三次典型行动
- Ronin(2022,$624M):假 offer → 恶意 PDF → 控制 Axie 工程师 → 拿 4 把验证者私钥 → 凑够 5/9。
- Radiant Capital(2024,$50M):通过 Telegram 发送"前同事"的恶意 PDF → macOS 后门 → 控制签名者设备 → 在多签界面上替换交易内容。
- Bybit(2025,$1.46B):社工 Safe 开发者 → 控制 S3 → 篡改前端 → 等目标发起多签交易 → 隐藏附加调用。
三次行动的共性:都不需要 0day,都需要"一个人点了一下"。而且都选择了"签名者"或"能影响签名界面的人"作为目标——因为那是资金链上唯一的人。
组织防御的现实做法:把"高权限签名者"当作高价值目标对待——专用设备、不装聊天软件、不处理邮件、不在社交媒体暴露职位;签名操作在一台只做签名的机器上完成。
20. G 类 · 密码学与共识层
这一类事件最少,但一旦发生就动摇根基。多数"密码学被攻破"的传闻,实际是实现或随机数的问题。
20.1 弱随机数:最真实的密码学事故
私钥的本质是一个 256 位随机数。如果生成时熵不足,私钥空间会从 2256 塌缩到可枚举的规模。
| 事件 | 机制 | 后果 |
|---|---|---|
| Profanity 工具漏洞 | 用 32 位随机数做种子生成"靓号地址",实际熵仅约 232 | Wintermute 做市商地址被暴力破解,$160M(2022) |
| Randstorm(BitcoinJS 类库) | 2011–2015 年部分浏览器钱包用 Math.random() 等弱熵源 | 约 $1B 历史地址受影响(2023 披露) |
| 移动端 SDK 熵缺陷 | 多个钱包在低熵环境下生成助记词 | 批量撞库可命中 |
这类攻击的特点是离线、无声、可批量:攻击者不需要接触你,只需要在本地穷举可能的私钥,然后扫余额。你看到的是"某天钱包突然空了",链上没有任何可疑授权。
20.2 共识层攻击
| 类型 | 可行性 | 说明 |
|---|---|---|
| 51% 双花 | 小市值 PoW 链可行 | 租算力 → 私下挖一条更长链 → 充币后回滚。ETC、BTG 均发生过 |
| 链重组(Reorg) | 大链极难,小链常见 | 交易所需按确认数风控 |
| 日蚀攻击(Eclipse) | 理论可行 | 隔离节点的对等网络,使其看到错误链 |
| 长程攻击 | PoS 理论风险 | 弱主观性检查点可缓解 |
| 量子计算 | 目前不可行 | Shor 算法可破 ECDSA;后量子签名是长期议题 |
判断标准:如果一条链的算力/质押成本低于其上承载的资产价值,它就天然适合被 51% 攻击。交易所对小数市值币种设置更高的确认数,原因就在这里。
21. H 类 · 诈骗(非技术入侵)
归类声明:本类不属于"黑客入侵"——没有私钥被窃、没有签名被欺骗、没有代码被利用,资产是受害者自愿转出的。单独列出,是因为它们在真实损失中占比极高,且在传播中经常被混称为"被黑"。理解这个区别,才能选对防御手段。
| 类型 | 机制 | 与黑客手段的关键区别 |
|---|---|---|
| Rug Pull(撤池跑路) | 项目方预留增发/撤池权限,拉高后抽走流动性 | 合约按设计运行;作恶者是"有权限的人" |
| 貔貅盘(Honeypot) | 合约限制只有白名单能卖,买入即无法卖出 | 代码逻辑公开可查,但用户不看 |
| 假交易所 / 假 App | 高仿站、假客服引导充值,提现时要求"缴税" | 没有链上入侵,钱直接进了对方账户 |
| 杀猪盘(Pig Butchering) | 长期情感/投资关系建立信任,诱导转入假平台 | 周期以月计,属社会工程诈骗 |
| 假空投 + 领取费 | "先付 gas 才能领",付了就没有下文 | 纯转账,无授权 |
| 拉高出货(Pump & Dump) | 社群喊单拉盘,庄家出货 | 市场行为,通常不构成技术攻击 |
21.1 一句话区分
黑客手段:你没有转账,钱却走了。
诈骗:你自己按了"发送"。
这两类在链上看起来完全不同:前者有一笔不是你发起的交易(或你签了但不知道内容),后者有一笔你亲手签的、语义清晰的转账。被盗后第一时间区分,决定了后面的处置路径。
21.2 为什么专业机构也常被诈骗
2024 年的一次典型事件中,某知名协议的核心贡献者在视频会议中被 Deepfake 伪造的"合作方高管"说服,执行了一笔"测试转账",损失数十万美元。技术防护(多签、硬件钱包)在这类场景下完全无效——因为交易本身是合法发起的、内容是正确的、签名是真实的。
可用的防御只有流程:任何转账都必须经过"第二通道"确认(例如:视频会议里说的账号,必须通过另一个已知号码回拨确认)。
22. 个人自查手册
下面这份清单按"投入产出比"排序。前三条能挡掉绝大多数损失,后面的属于加固。
22.1 先把账户分层
| 层 | 用途 | 存放 | 上限 |
|---|---|---|---|
| 金库 Vault | 长期持有,几乎不动 | 硬件钱包 / 多签,助记词离线分片 | 全部资产的 80%+ |
| 交易 Trading | 交易所买卖 | 合规交易所,独立邮箱 + 硬件 2FA | 短期头寸 |
| 交互 DeFi | 连接 DApp、mint、空投 | 独立热钱包,只放小额 | "全丢也不心疼"的量 |
| 测试 Burner | 不明链接、新协议、空投领取 | 一次性地址 | 接近 0 |
分层的本质是"降低单点价值"。所有账户共用一个助记词,等于没有分层——派生路径不同也救不了你,因为助记词一泄露,全部派生地址同时沦陷。
22.2 30 项自查
| # | 检查项 | 不合格的后果 |
|---|---|---|
| 1 | 助记词从未以任何形式进入联网设备(照片、备忘录、云盘、聊天记录) | A 类全灭 |
| 2 | 助记词有物理备份,且不在单一点(防火/防水/分片) | 丢失或损毁 |
| 3 | 大额地址使用硬件钱包,且固件来自官方渠道 | 盲签 + 供应链 |
| 4 | 硬件钱包屏幕能完整显示收款地址,且你逐段核对 | 地址投毒 |
| 5 | 交易所开启硬件密钥或 TOTP,不用短信 | SIM Swap |
| 6 | 交易所邮箱独立,且该邮箱本身开启 2FA | 账号接管 |
| 7 | 每季度用 revoke.cash 清理一次授权 | B 类慢性失血 |
| 8 | 从不点"Max"授权,按需给额度 | 无限授权 |
| 9 | 不签任何看不懂的 eth_sign / 盲签请求 | 任意交易被构造 |
| 10 | 拒绝一切来源不明的 7702 委托 / "钱包升级" | 地址被永久劫持 |
| 11 | 收款地址从地址簿选,不从交易历史复制 | 地址投毒 |
| 12 | 访问 DApp 用书签,不用搜索广告 | 钓鱼站 |
| 13 | 钱包扩展只从官方商店安装,且核对开发者 | 假扩展 |
| 14 | 浏览器不装来源不明的扩展 | 读取页面与剪贴板 |
| 15 | 不用破解软件、不装"空投工具" | infostealer |
| 16 | 客服/官方从不私聊你;私聊的一律是骗子 | 远控 / 助记词 |
| 17 | 不安装 AnyDesk / TeamViewer 给"客服" | 设备被完全控制 |
| 18 | 签名设备不装聊天软件、不处理邮件 | F 类社工 |
| 19 | 大额转账前用第二通道确认收款方 | Deepfake / 假合作方 |
| 20 | 多签至少 3/5,且签名者分布在不同物理位置 | 单点沦陷 |
| 21 | 多签的前端与硬件钱包来自不同厂商 | 同源供应链 |
| 22 | 多签升级有 24h+ 时间锁与独立监控 | Bybit 式攻击 |
| 23 | 不在社交媒体公开持仓与职位 | 定向社工 |
| 24 | 不参与"保证收益"的任何项目 | H 类 |
| 25 | 新代币先查合约是否可增发/可改税/可暂停 | 貔貅盘 |
| 26 | 小额测试后再转大额 | 地址/链选错 |
| 27 | 记录常用地址与合约,异常时能对照 | 无法及时发现 |
| 28 | 开启地址监控(如 Etherscan 邮件提醒) | 反应延迟 |
| 29 | 知道被盗后该联系谁(见第 25 章) | 错过黄金时间 |
| 30 | 定期演练:假设今天被盗,第一步做什么 | 慌乱中二次损失 |
23. 项目方防御对照表
把第三部分的每类手法,映射到"预防 / 检测 / 响应"三列。这张表可以直接当作安全建设的路线图。
| 手法 | 预防 | 检测 | 响应 |
|---|---|---|---|
| 私钥泄露 | HSM/MPC、分片、离线签名、最小权限 | 异常签名时间/额度、非白名单地址 | 轮换密钥、暂停提币、广播救援交易 |
| approve 钓鱼 | 前端提示风险、限额授权、授权到期 | 监控大额 Approval 事件 | 引导用户 revoke、下架恶意 spender |
| 供应链(前端) | SRI、发布签名、S3 写权限隔离、双人复核 | 构建产物 hash 比对、CDN 完整性监控 | 回滚、全量通告、强制重新签名 |
| npm 投毒 | 锁版本、私有镜像、禁用 postinstall | 依赖 diff、异常网络请求 | 锁定版本、发布安全公告 |
| 合约漏洞 | 审计 + 形式化验证 + 模糊测试 + 暂停开关 | 链上异常调用模拟、TVL 突变告警 | 暂停合约、协商白帽赏金 |
| 预言机操纵 | 多源 TWAP、拒绝现货价、借款上限 | 价格偏离阈值告警 | 暂停市场、调整参数 |
| 代理升级滥用 | 独立 admin 多签 + 时间锁 + guardian | 监控 Upgraded 事件 | 取消待执行提案、暂停 |
| 跨链桥 | 多验证器 + 轻客户端验证 + 限额 | 异常跨链消息、验证者行为异常 | 暂停桥、冻结流动性 |
| 服务器入侵 | 零信任、跳板机、补丁、最小暴露面 | EDR、异常进程、外联告警 | 隔离主机、轮换全部凭据 |
| 内部人员 | 职责分离、双人复核、强制休假 | 不可抵赖审计日志、行为基线 | 冻结权限、取证 |
| 社工 / APT | 高权限人员专用设备、安全意识演练 | 邮件网关、终端 EDR、异常登录 | 隔离、取证、通告合作方 |
一个可落地的优先级:如果只能做三件事,做这三件——
① 把升级权限与资金权限拆成两个多签;
② 给前端加发布签名与完整性监控;
③ 给热钱包设置单笔与日累计限额,且限额逻辑独立于提币服务。
24. 参数与指令速查
以下命令用于自查授权、核对合约权限、复核交易。示例以以太坊主网为例,其他 EVM 链换 --rpc-url 即可。
24.1 查授权
# 查某代币对某 spender 的授权额度
cast call 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 \
"allowance(address,address)(uint256)" \
0x你的地址 0xspender地址 \
--rpc-url $ETH_RPC
# 查余额
cast call 0xA0b8...eB48 "balanceOf(address)(uint256)" 0x你的地址 --rpc-url $ETH_RPC
# 撤销授权(把额度置 0)
cast send 0xA0b8...eB48 "approve(address,uint256)" 0xspender地址 0 \
--rpc-url $ETH_RPC --private-key $PK
24.2 查代理与权限
# EIP-1967 实现槽(implementation)
cast storage 0x代理地址 \
0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc \
--rpc-url $ETH_RPC
# EIP-1967 管理员槽(admin)
cast storage 0x代理地址 \
0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103 \
--rpc-url $ETH_RPC
# 读 owner
cast call 0x合约 "owner()(address)" --rpc-url $ETH_RPC
24.3 查多签
# 阈值与签名者
cast call 0xSafe "getThreshold()(uint256)" --rpc-url $ETH_RPC
cast call 0xSafe "getOwners()(address[])" --rpc-url $ETH_RPC
cast call 0xSafe "nonce()(uint256)" --rpc-url $ETH_RPC
# 解码一笔待签交易的 calldata
cast 4byte 0xa9059cbb
cast decode-calldata "transfer(address,uint256)" 0x...data
24.4 签名前复核
# 看 selector 对应什么函数
cast 4byte-calldata 0x你的calldata
# 本地模拟执行(不广播),看余额变化
cast run 0x交易哈希 --rpc-url $ETH_RPC
# 计算函数选择器
cast sig "transfer(address,uint256)"
| 工具 | 用途 | 地址 |
|---|---|---|
| revoke.cash | 批量查看/撤销授权 | revoke.cash |
| Etherscan Token Approval | 单链授权检查 | etherscan.io/tokenapprovalchecker |
| Safe Transaction Service | 多签交易队列与签名者核对 | safe.global |
| Chainabuse | 上报诈骗地址 | chainabuse.com |
| 慢雾 Hacked | 历史事件档案库 | hacked.slowmist.io |
25. 被盗后黄金 10 分钟
被盗后的每一步都在和攻击者抢时间。以下顺序按"能挽回的金额"排序,不要跳步。
25.1 时间线
| 时间 | 动作 | 目的 |
|---|---|---|
| 0–2 min | 确认是否还有剩余资产;若有,用另一个干净的钱包转出 | 防止二次损失(攻击者常留后手) |
| 2–5 min | 撤销该地址对所有合约的授权(revoke.cash,用干净设备) | 切断后续扣款 |
| 5–10 min | 记录攻击者地址、交易哈希、时间;截图 | 后续报案与申诉的证据 |
| 10–30 min | 在链上给攻击者地址打 0 值交易留言(部分分析工具会索引);同时向 Chainabuse 上报 | 标记地址,便于交易所拦截 |
| 30–60 min | 联系被盗资金流向的交易所客服 / 安全团队;联系慢雾等安全公司 | 争取在入金环节冻结 |
| 当天 | 报案(本地网警 / IC3);整理完整资金流向图 | 立案与跨境协作前提 |
| 持续 | 监控攻击者地址异动,向每次新流入的交易所提交冻结申请 | 提升追回概率 |
三个常见错误:
① 在原设备上操作(可能已被控,二次被盗);
② 先发推特求助再处理资产(攻击者也在看,会加速转移);
③ 相信"能帮你追回资金"的第三方(绝大多数是二次诈骗)。
25.2 该联系谁
- 交易所安全团队:如果资金流入某交易所,直接联系其 security 邮箱,提供 txid 与地址。
- 安全公司:慢雾(SlowMist)、CertiK、PeckShield 等,通常提供免费的事件分析与地址标记。
- 执法:国内向属地网警报案;跨境可向 FBI IC3 提交。
- 链上标记:Chainabuse、MistTrack 等平台提交地址标签。
26. 如何读一份复盘报告
同一事件会有三种材料,可信度与用途完全不同。混着读,就会得出错误结论。
| 材料类型 | 特征 | 可信度 | 怎么用 |
|---|---|---|---|
| 官方公告 / PR 稿 | 措辞谨慎,强调"用户资产安全""已弥补缺口" | 中低(有公关动机) | 取时间线与金额,不取根因结论 |
| 第三方取证报告 | Sygnia、Verichains、DARKNAVY 等,含样本与调用链 | 高 | 取技术细节与根因 |
| 链上数据 | 交易哈希、资金流向、合约调用 | 最高(客观) | 验证前两者是否一致 |
26.1 五个必问
- 根因落在哪一层?私钥、签名、前端、合约、基础设施——不同层的修复方案完全不同。
- 攻击者拿到的是"一次性"还是"持续性"能力?一次签名 vs 私钥 vs 升级权限,影响后续风险窗口。
- 有没有"本可以拦住"的控制点?时间锁、限额、多源预言机、SRI——复盘的价值在于找出这些缺口。
- 时间线是否自洽?从入侵到转移的时间差,往往暴露了检测能力的缺失。
- 金额口径是什么?被盗总额、未追回额、已赔付额经常被混用。
一个典型陷阱:很多复盘把"攻击手法"写成"社工 + 恶意软件"就结束了。但真正需要回答的是——为什么一台开发机能够影响生产环境的签名界面?根因往往在权限设计,而不在"员工点了链接"。
27. 术语索引
| 术语 | 英文 | 一句话解释 | 章节 |
|---|---|---|---|
| 外部账户 | EOA | 由私钥直接控制的账户,签名即生效 | 1.3 |
| 合约账户 | Contract Account | 由代码控制,转账需满足逻辑 | 1.3 |
| 授权额度 | allowance | ERC-20 中允许他人动用的上限,链上长期有效 | 3.1 |
| 离线授权签名 | Permit (EIP-2612) | 不上链的授权签名,可被他人代提交 | 3.1 |
| 统一授权合约 | Permit2 | 一次签名覆盖所有 ERC-20 的授权层 | 3.1 |
| 盲签 | Blind Signing | 签名设备无法展示真实语义 | 3.3 |
| 地址投毒 | Address Poisoning | 用相似地址污染交易历史 | 3.3 |
| 委托代码 | EIP-7702 | 给 EOA 设置合约代码,可持续劫持入账 | 3.2 |
| 代理合约 | Proxy | 逻辑与存储分离,可升级 | 4.2 / 11 |
| 委托调用 | delegatecall | 在调用者存储上下文中执行被调合约代码 | 4.2 |
| 闪电贷 | Flash Loan | 同笔交易内借还、无需抵押 | 5.1 |
| 重入 | Reentrancy | 状态更新前被回调再次进入 | 5.2 |
| 预言机操纵 | Oracle Manipulation | 用交易改变协议读取的价格 | 5.2 |
| 分层 | Layering | 洗钱中切断资金关联的阶段 | 8.1 |
| 混币器 | Mixer | 打乱输入输出对应关系 | 8.1 |
| 聚类 | Clustering | 链上分析中把地址归为同一主体 | 8.2 |
| 供应链攻击 | Supply Chain Attack | 攻击目标信任的上游组件 | 16 |
| 信息窃取木马 | Infostealer | 专门窃取浏览器/钱包凭据的恶意软件 | 14.1 |
| 威胁情报 | CTI | 对攻击者、基础设施、TTP 的情报汇总 | 19 |
| 弱随机数 | Weak RNG | 私钥熵不足,可被暴力枚举 | 20.1 |
数据口径说明:本文金额来自 Chainalysis、CertiK、TRM Labs、DeFiLlama、Immunefi 与慢雾 Hacked 档案库的公开统计,统计窗口与归类方式各不相同(例如"基础设施攻击"是否包含私钥泄露),因此不可跨表相加。所有金额仅用于判断结构比例,不作为精确赔付依据。
本文面向安全研究与防御建设,对利用细节仅描述到机制层。若你是受害者,请直接跳至 第 25 章。